diff --git a/models/issues/comment.go b/models/issues/comment.go
index be020b2e1f..e781931261 100644
--- a/models/issues/comment.go
+++ b/models/issues/comment.go
@@ -777,6 +777,12 @@ func (c *Comment) LoadPushCommits(ctx context.Context) (err error) {
 
 // CreateComment creates comment with context
 func CreateComment(ctx context.Context, opts *CreateCommentOptions) (_ *Comment, err error) {
+	ctx, committer, err := db.TxContext(ctx)
+	if err != nil {
+		return nil, err
+	}
+	defer committer.Close()
+
 	e := db.GetEngine(ctx)
 	var LabelID int64
 	if opts.Label != nil {
@@ -832,7 +838,9 @@ func CreateComment(ctx context.Context, opts *CreateCommentOptions) (_ *Comment,
 	if err = comment.AddCrossReferences(ctx, opts.Doer, false); err != nil {
 		return nil, err
 	}
-
+	if err = committer.Commit(); err != nil {
+		return nil, err
+	}
 	return comment, nil
 }
 
diff --git a/services/issue/comments.go b/services/issue/comments.go
index ed05f725ff..2c5ef0f5dc 100644
--- a/services/issue/comments.go
+++ b/services/issue/comments.go
@@ -15,26 +15,6 @@ import (
 	"code.gitea.io/gitea/modules/timeutil"
 )
 
-// CreateComment creates comment of issue or commit.
-func CreateComment(ctx context.Context, opts *issues_model.CreateCommentOptions) (comment *issues_model.Comment, err error) {
-	ctx, committer, err := db.TxContext(ctx)
-	if err != nil {
-		return nil, err
-	}
-	defer committer.Close()
-
-	comment, err = issues_model.CreateComment(ctx, opts)
-	if err != nil {
-		return nil, err
-	}
-
-	if err = committer.Commit(); err != nil {
-		return nil, err
-	}
-
-	return comment, nil
-}
-
 // CreateRefComment creates a commit reference comment to issue.
 func CreateRefComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, content, commitSHA string) error {
 	if len(commitSHA) == 0 {
@@ -53,7 +33,7 @@ func CreateRefComment(ctx context.Context, doer *user_model.User, repo *repo_mod
 		return nil
 	}
 
-	_, err = CreateComment(ctx, &issues_model.CreateCommentOptions{
+	_, err = issues_model.CreateComment(ctx, &issues_model.CreateCommentOptions{
 		Type:      issues_model.CommentTypeCommitRef,
 		Doer:      doer,
 		Repo:      repo,
@@ -66,7 +46,7 @@ func CreateRefComment(ctx context.Context, doer *user_model.User, repo *repo_mod
 
 // CreateIssueComment creates a plain issue comment.
 func CreateIssueComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, content string, attachments []string) (*issues_model.Comment, error) {
-	comment, err := CreateComment(ctx, &issues_model.CreateCommentOptions{
+	comment, err := issues_model.CreateComment(ctx, &issues_model.CreateCommentOptions{
 		Type:        issues_model.CommentTypeComment,
 		Doer:        doer,
 		Repo:        repo,
diff --git a/services/pull/comment.go b/services/pull/comment.go
index 24dfd8af0c..14fba52f1e 100644
--- a/services/pull/comment.go
+++ b/services/pull/comment.go
@@ -11,7 +11,6 @@ import (
 	user_model "code.gitea.io/gitea/models/user"
 	"code.gitea.io/gitea/modules/git"
 	"code.gitea.io/gitea/modules/json"
-	issue_service "code.gitea.io/gitea/services/issue"
 )
 
 // getCommitIDsFromRepo get commit IDs from repo in between oldCommitID and newCommitID
@@ -90,7 +89,7 @@ func CreatePushPullComment(ctx context.Context, pusher *user_model.User, pr *iss
 
 	ops.Content = string(dataJSON)
 
-	comment, err = issue_service.CreateComment(ctx, ops)
+	comment, err = issues_model.CreateComment(ctx, ops)
 
 	return comment, err
 }
diff --git a/services/pull/pull.go b/services/pull/pull.go
index cf49d2fe20..8730b9684d 100644
--- a/services/pull/pull.go
+++ b/services/pull/pull.go
@@ -125,7 +125,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, pull *issu
 			Content:     string(dataJSON),
 		}
 
-		_, _ = issue_service.CreateComment(ctx, ops)
+		_, _ = issues_model.CreateComment(ctx, ops)
 
 		if !pr.IsWorkInProgress() {
 			if err := issues_model.PullRequestCodeOwnersReview(ctx, pull, pr); err != nil {
@@ -231,7 +231,7 @@ func ChangeTargetBranch(ctx context.Context, pr *issues_model.PullRequest, doer
 		OldRef: oldBranch,
 		NewRef: targetBranch,
 	}
-	if _, err = issue_service.CreateComment(ctx, options); err != nil {
+	if _, err = issues_model.CreateComment(ctx, options); err != nil {
 		return fmt.Errorf("CreateChangeTargetBranchComment: %w", err)
 	}
 
diff --git a/services/pull/review.go b/services/pull/review.go
index 59cc607912..58470142e1 100644
--- a/services/pull/review.go
+++ b/services/pull/review.go
@@ -20,7 +20,6 @@ import (
 	"code.gitea.io/gitea/modules/notification"
 	"code.gitea.io/gitea/modules/setting"
 	"code.gitea.io/gitea/modules/util"
-	issue_service "code.gitea.io/gitea/services/issue"
 )
 
 var notEnoughLines = regexp.MustCompile(`fatal: file .* has only \d+ lines?`)
@@ -248,7 +247,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo
 			return nil, err
 		}
 	}
-	return issue_service.CreateComment(ctx, &issues_model.CreateCommentOptions{
+	return issues_model.CreateComment(ctx, &issues_model.CreateCommentOptions{
 		Type:        issues_model.CommentTypeCode,
 		Doer:        doer,
 		Repo:        repo,
@@ -340,7 +339,7 @@ func DismissApprovalReviews(ctx context.Context, doer *user_model.User, pull *is
 				return err
 			}
 
-			comment, err := issue_service.CreateComment(ctx, &issues_model.CreateCommentOptions{
+			comment, err := issues_model.CreateComment(ctx, &issues_model.CreateCommentOptions{
 				Doer:     doer,
 				Content:  "New commits pushed, approval review dismissed automatically according to repository settings",
 				Type:     issues_model.CommentTypeDismissReview,
@@ -411,7 +410,7 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string,
 		return nil, err
 	}
 
-	comment, err = issue_service.CreateComment(ctx, &issues_model.CreateCommentOptions{
+	comment, err = issues_model.CreateComment(ctx, &issues_model.CreateCommentOptions{
 		Doer:     doer,
 		Content:  message,
 		Type:     issues_model.CommentTypeDismissReview,